package com.byron.media.server.handlers;

import com.byron.media.server.model.DataFactory;
import com.byron.media.server.model.MediaData;
import com.byron.media.server.model.ProxyMediaData;
import com.byron.media.server.utils.MediaType;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;

//@ChannelHandler.Sharable
public class MediaEncoder extends ChannelOutboundHandlerAdapter {

    private DataFactory dataFactory;

    private long counter;

    public MediaEncoder(DataFactory dataFactory) {
        this.dataFactory = dataFactory;
    }

    @Override
    public void write(ChannelHandlerContext ctx, Object message, ChannelPromise promise) throws Exception {
        counter++;
        if(message instanceof MediaData){
            MediaData data = (MediaData)message;
            ByteBuf buf = ctx.alloc().buffer(data.getLength() + 4);
            buf.writeByte((byte)'$');   // $ 开始符
            buf.writeByte(data.getChannel());     // 通道号
            buf.writeByte(data.getType());     // 类型
            buf.writeLong(data.getSeq());           // 单元号
            buf.writeInt(data.getLength());  // 数据长度
            buf.writeBytes(data.getData(), 0, data.getLength());       // 数据
//            if(counter % 5 == 0){
                ctx.writeAndFlush(buf, promise);
//            } else {
//                ctx.write(buf, promise);
//            }
//            buf.release();
            return;
        }

        if(message instanceof ProxyMediaData){

            ProxyMediaData proxyData = (ProxyMediaData)message;
            if(proxyData.getMediaData() == null){
                return;
            }

            byte[] groupNameBytes = proxyData.getGroupName().getBytes(StandardCharsets.UTF_8);      // 字符串长度

            ByteBuf buf = ctx.alloc().buffer(proxyData.getMediaData().getLength() + 5 + 2 + groupNameBytes.length + 15);
            buf.writeByte((byte)'$');   // $ 开始符
            buf.writeByte(proxyData.getMediaData().getChannel());     // 通道号
            byte type = MediaType.putProxy(proxyData.getMediaData().getType());
            buf.writeByte(type);     // 类型
            buf.writeLong(proxyData.getMediaData().getSeq());           // 单元号
            buf.writeInt(proxyData.getMediaData().getLength() + 5 + 2 + groupNameBytes.length);  // 数据长度


            buf.writeShort(groupNameBytes.length);
            buf.writeBytes(groupNameBytes);

            MediaData data = proxyData.getMediaData();
//            buf.writeByte((byte)'$');   // $ 开始符
//            buf.writeByte(data.getChannel());     // 通道号
            buf.writeByte(data.getType());     // 类型
//            buf.writeLong(data.getID());           // 单元号
            buf.writeInt(data.getLength());  // 数据长度
            buf.writeBytes(data.getData(), 0, data.getLength());       // 数据
            ctx.writeAndFlush(buf, promise);
//            buf.release();
            return;
        }

        if(message instanceof String){
            String msg = ((String) message) + "\n";
            byte[] data = msg.getBytes("UTF8");
            ByteBuf buf = ctx.alloc().buffer(data.length);
            buf.writeBytes(data);       // 数据
            ctx.writeAndFlush(buf, promise);
            return;
        }
    }
}
